题目描述
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
将两个链表连起来。
/**
* 思路:
1.输入问题:考虑为空!
2.新链表的第一个结点问题,由于一般情况下第一个结点都需要特殊处理,比较实用的解决办法是在第一个结点前增加一个虚拟的头结点,将实际的第一个结点一般化。最后输出的时候输出这个虚拟结点的下一个结点就OK
3.如何为新链表选择下一个结点(已经虚拟出第一个结点了。)这个比较容易,比大小就OK了。取小的并在此链表前进一步。
4.注意循环的终止条件!
5.终止后并没有结束!
* @param l1
* @param l2
* @return
*/
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null && l2 == null)
return null;
if(l1 == null)
return l2;
if(l2 == null)
return l1;
ListNode newHead = new ListNode(0);
ListNode tail = newHead; //这个tail真实太棒了,一直沿着正确的路径走下去
ListNode cur1 = l1;
ListNode cur2 = l2;
while(cur1!=null && cur2!=null){
if(cur1.val < cur2.val){
tail.next = cur1;
tail = tail.next;
cur1 = cur1.next;
}else{
tail.next = cur2;
tail = tail.next;
cur2 = cur2.next;
}
}
if(cur1 != null)
tail.next = cur1;
if(cur2 != null)
tail.next = cur2;
return newHead.next;
}
}
这个tail节点简直不能更棒!它走过的路径就是最终的结果。为了把头结点一般化,在前面加一个节点,然后开始往后走,最终返回头结点的next节点,这样的思路下来就很简单了,首先是定义一个头结点,然后就是一个大循环,循环内比较链表节点值的大小,tail指向值小的节点,同时,当前节点cur被赋值为下一个节点。最终返回的是定义的头结点的next。整个过程清晰明了!我献上了我的膝盖!