合并两个排序的链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则
思路一:新建一个链表,从前往后遍历两个链表,谁小谁先进新链表。采用递归的方式。
思路二:思路一采用的是递归的方法,思路二采用非递归的方法。
思路一
新建一个链表,从前往后遍历两个链表,谁小谁先进新链表。采用递归的方式。
public static ListNode listMerge(ListNode list1, ListNode list2){ if (list1 == null) return list2;//判断某个链表为空就返回另一个链表。 if (list2 == null) return list1; ListNode mergeList = null;//定义一个链表作为返回值 if (list1.val <= list2.val) {//如果list1的值比较小,就先把list1赋值给mergeList mergeList = list1; mergeList.next = listMerge(list1.next, list2);//做递归,求链表下一个结点的值 } else {//如果list2的值比较小,就先把list1赋值给mergeList mergeList = list2; mergeList.next = listMerge(list1, list2.next);//做递归,求链表下一个结点的值 } return mergeList; }
可以简化一下,用三目运算符
mergeList = list1.val > list2.val ? list2:list1; mergeList.next = list1.val > list2.val ? listMerge(list1, list2.next):listMerge(list1.next, list2);
思路二
思路一采用的是递归的方法,思路二采用非递归的方法。
public static ListNode listMerge2(ListNode list1, ListNode list2){ if (list1 == null) return list2;//判断某个链表为空就返回另一个链表。 if (list2 == null) return list1; ListNode mergeList = new ListNode(0);//为什么不是为null.因为下面要有mergeList.next // ListNode mergeList = null; ListNode temp1 = list1; ListNode temp2 = list2; ListNode head = mergeList;//保留其指针位置 while(temp1 != null && temp2 != null){ if (temp1.val <= temp2.val) { mergeList.next = temp1; mergeList = mergeList.next; temp1 = temp1.next; } else {//如果list2的值比较小,就先把list1赋值给mergeList mergeList.next = temp2; mergeList = mergeList.next; temp2 = temp2.next; } }//while end.其中一条链表已经遍历完 if (temp1 != null) { mergeList.next = temp1; mergeList = mergeList.next; temp1 = temp1.next; } if (temp2 != null) { mergeList.next = temp2; mergeList = mergeList.next; temp2 = temp2.next; } mergeList = head.next; return mergeList; }
有两个链表,由于链表这种数据结构方便插入,所以我们可以在其中一个链表上进行插入另外一个链表。