将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。
合并有序链表
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; } } }