将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。
合并有序链表
http://www.nowcoder.com/questionTerminal/a479a3f0c4554867b35356e0d57cf03d
思路:本体没有要求必须使用交换元素的方式,即可以使用新的链表,这就简单多了!一开始陷进去是想不利用新的链表,将其排序整合,但是有些乱;
提示:处理头节点!
public class HeBingLinkedList {
public static void main(String[] args) {
//测试用
ListNode l1 = new ListNode(2);
l1.next = new ListNode(4);
ListNode l2 = new ListNode(1);
l2.next = new ListNode(3);
ListNode listNode = mergeTwoLists(l1, l2);
System.out.println(listNode);
}
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 判断边缘条件
if (null == l1) return l2;
if (null == l2) return l1;
//把头节点小的部分作为新的节点
boolean l1AsHead = l1.val < l2.val;
ListNode res = new ListNode(l1AsHead ? l1.val : l2.val);
//值传递机制可知,temp 和 res 操作同一个对象,但是,res 是头,temp 是其中用来操作的一个动态节点
ListNode temp = res;
//如果 l1 作为了头节点,那么 cur1 就表示 l1 剩下的部分,依次比较两个链表未合并部分的头
ListNode cur1 = l1AsHead ? l1.next : l1;
ListNode cur2 = l1AsHead ? l2 : l2.next;
while (null != cur1 && null != cur2) {
l1AsHead = cur1.val < cur2.val;
temp.next = new ListNode(l1AsHead ? cur1.val : cur2.val);
//注意这里要用 temp 来对 res 下一节点进行赋值
temp = temp.next;
cur1 = l1AsHead ? cur1.next : cur1;
cur2 = l1AsHead ? cur2 : cur2.next;
}
//如果其中一条链表遍历结束,那么另外一条有序链表的 未比较的部分直接加入 res 之后
if (null == cur1) temp.next = cur2;
if (null == cur2) temp.next = cur1;
return res;
}
public static class ListNode {
int val;
ListNode next = null;
public ListNode(int val) {
this.val = val;
}
@Override
public String toString() {
return " " + val + " - > " + next;
}
}
}