递归的思想:个人感觉先写递归表达式,想象最后一层的情况,思考跳出的条件。
合并两个顺序表:
public ListNode mergeTwoLists(ListNode l1,ListNode l2)
{
if (l1 == null)
return l2;
if (l2 == null)
return l1;
if(l1.val < l2.val)
{
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}
else
{
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
删除顺序链表总重复的元素:
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null)return head;
head.next = deleteDuplicates(head.next);
return head.val == head.next.val ? head.next : head;
}
单链表的合并排序:
public static ListNode sortList(ListNode head)
{
if (head==null || head.next == null)
return head;
ListNode prev=null,slow=head,fast=head; //快慢指针找到中间节点,慢的走一步,快的走两步,当快的到达最后,慢的会在中间
while (fast != null && fast.next != null)
{
prev = slow;
slow = slow.next;
fast = fast.next.next;
}
prev.next = null; //进行分割
ListNode left = sortList(head); //递归前半段排序
ListNode right = sortList(slow); //递归后半段排序
return merge(left,right);
}