这几个LeetCode的题目都可以通过递归来解决链表问题,汇总记下。
#206 反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
public ListNode reverseList(ListNode head) {
//1.递归
//递归结束的条件
if(head == null || head.next == null)
return head;
ListNode next = head.next;
ListNode newNode = reverseList(next);
next.next = head;
head.next = null;
return newNode;
//2.头插法
// ListNode newHead = new ListNode(-1);
// while(head != null) {
// ListNode next = head.next;
// head.next = newHead.next;
// newHead.next = head;
// head = next;
// }
// return newHead.next;
}
#21 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//1.迭代
// ListNode preHead = new ListNode(-1);
// ListNode prev = preHead;
//
// while(l1 != null || l2 != null) {
// if(l1.val <= l2.val) {
// prev.next = l1;
// l1 = l1.next;
// }
// else {
// prev.next = l2;
// l2 = l2.next;
// }
// prev = prev.next;
// }
// prev.next = (l1 == null) ? l2 : l1;
// return preHead.next;
//2.递归
if(l1 == null)
return l2;
else if(l2 == null)
return l1;
else if(l1.val <= l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}
else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
#83 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
public ListNode deleteDuplicates(ListNode head) {
//1.递归
if(head == null || head.next == null)
return head;
head.next = deleteDuplicates(head.next);
return head.val == head.next.val ? head.next : head;
//2.直接
// ListNode cur = head;
// while(cur != null && cur.next != null) {
// if(cur.val == cur.next.val) {
// cur.next = cur.next.next;
// }
// else
// cur = cur.next;
// }
// return head;
}
总结
递归是很常见的解决链表问题的方法,这几个题很具有代表性。