链表是空节点,或者有一个值和一个指向下一个链表的指针,因此很多链表问题可以用递归来处理。
1. 找出两个链表的交点
160. Intersection of Two Linked Lists (Easy)
例如以下示例中 A 和 B 两个链表相交于 c1:
1 | A: a1 → a2 |
但是不会出现以下相交的情况,因为每个节点只有一个 next 指针,也就只能有一个后继节点,而以下示例中节点 c 有两个后继节点。
1 | A: a1 → a2 d1 → d2 |
要求时间复杂度为 O(N),空间复杂度为 O(1)。如果不存在交点则返回 null。
设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。
当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。
如果不存在交点,那么 a + b = b + a,以下实现代码中 l1 和 l2 会同时为 null,从而退出循环。
1 | public ListNode getIntersectionNode(ListNode headA, ListNode headB) { |
如果只是判断是否存在交点,那么就是另一个问题,即 编程之美 3.6 的问题。有两种解法:
- 把第一个链表的结尾连接到第二个链表的开头,看第二个链表是否存在环;
- 或者直接比较两个链表的最后一个节点是否相同。
2. 链表反转
206. Reverse Linked List (Easy)
递归
1 | public ListNode reverseList(ListNode head) { |
头插法
1 | public ListNode reverseList(ListNode head) { |
3. 归并两个有序的链表
21. Merge Two Sorted Lists (Easy)
1 | public ListNode mergeTwoLists(ListNode l1, ListNode l2) { |
4. 从有序链表中删除重复节点
83. Remove Duplicates from Sorted List (Easy)
1 | Given 1->1->2, return 1->2. |
1 | public ListNode deleteDuplicates(ListNode head) { |
5. 删除链表的倒数第 n 个节点
19. Remove Nth Node From End of List (Medium)
1 | Given linked list: 1->2->3->4->5, and n = 2. |
1 | public ListNode removeNthFromEnd(ListNode head, int n) { |
6. 交换链表中的相邻结点
24. Swap Nodes in Pairs (Medium)
1 | Given 1->2->3->4, you should return the list as 2->1->4->3. |
题目要求:不能修改结点的 val 值,O(1) 空间复杂度。
1 | public ListNode swapPairs(ListNode head) { |
7. 链表求和
445. Add Two Numbers II (Medium)
1 | Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) |
题目要求:不能修改原始链表。
1 | public ListNode addTwoNumbers(ListNode l1, ListNode l2) { |
8. 回文链表
234. Palindrome Linked List (Easy)
题目要求:以 O(1) 的空间复杂度来求解。
切成两半,把后半段反转,然后比较两半是否相等。
1 | public boolean isPalindrome(ListNode head) { |
9. 分隔链表
725. Split Linked List in Parts(Medium)
1 | Input: |
题目描述:把链表分隔成 k 部分,每部分的长度都应该尽可能相同,排在前面的长度应该大于等于后面的。
1 | public ListNode[] splitListToParts(ListNode root, int k) { |
10. 链表元素按奇偶聚集
328. Odd Even Linked List (Medium)
1 | Example: |
1 | public ListNode oddEvenList(ListNode head) { |
- 本文作者: LHS
- 本文链接: https:/LiuHuAshen.github.io/2021/06/10/链表/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!