剑指offer:合并两个排序的链表
解题思路
- 比较两个链表的首结点,哪个小的的结点则合并到第三个链表尾结点,并向前移动一个结点。
- 步骤一结果会有一个链表先遍历结束,或者没有
- 第三个链表尾结点指向剩余未遍历结束的链表
- 返回第三个链表首结点
递归版本
public ListNode Merge(ListNode list1,ListNode list2) { if(list1 == null){ return list2; } if(list2 == null){ return list1; } if(list1.val <= list2.val){ list1.next = Merge(list1.next, list2); return list1; }else{ list2.next = Merge(list1, list2.next); return list2; } }
非递归版本
public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { if(list1==null) return list2; if(list2==null) return list1; ListNode head = null; if(list1.val> list2.val){ head = list2; list2 = list2.next; }else{ head = list1; list1 = list1.next; } ListNode curr = head; while(list1!=null && list2!=null){ if(list1.val > list2.val){ curr.next = list2; list2 = list2.next; curr = curr.next; }else{ curr.next = list1; list1 = list1.next; curr = curr.next; } } if(list1!=null){ curr.next = list1; } if(list2!=null){ curr.next = list2; } return head; } }
可以看出,递归版本简洁得多,通常可以用循环解决的问题都可以尝试用递归解决。