LC-21:合并两个有序链表
LC-21:合并两个有序链表:
我的算法思路实现一:
public class AtomicDemone {
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
node1.next = node2;
node2.next = node3;
ListNode node5 = new ListNode(1);
ListNode node6 = new ListNode(3);
ListNode node7 = new ListNode(4);
node5.next = node6;
node6.next = node7;
ListNode listNode = mergeTwoLists(node1, node5);
while (listNode != null) {
System.out.println(listNode.val);
listNode = listNode.next;
}
}
public static ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ArrayList<Integer> list = new ArrayList<>();
while (list1 != null) {
list.add(list1.val);
list1 = list1.next;
}
while (list2 != null) {
list.add(list2.val);
list2 = list2.next;
}
Collections.sort(list);
ListNode result = new ListNode(-1);
ListNode current = result;
for (int i = 0; i < list.size(); i++) {
current.next = new ListNode(list.get(i));
current = current.next;
}
return result.next;
}
}
主要思路:使用ArrayList对两个链表进行遍历。记录里面的所有的元素,然后使用JDK的集合工具类Collections.sort(list)进行排序,然后对list集合中的所有的元素进行遍历,实现对每一个结点创建构建链表,然后然后链表。
我的算法思路实现二:
public static ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode result = new ListNode(-1);
ListNode current = result;
while (list1 != null && list2 != null) {
if (list1.val <= list2.val) { // 对于list1中的值小于等于list2 ,那就是存list1中的值
current.next = new ListNode(list1.val); // 存在新的链表中
current = current.next;
list1 = list1.next;
} else { // 对于list1中的值大于list2 ,那就是存list2中的值
current.next = new ListNode(list2.val); // 存在新的链表中
current = current.next;
list2 = list2.next;
}
}
// 对list1进行判空
if (list1 != null) {
current.next = list1;
}
// 对list2进行判空
if (list2 != null) {
current.next = list2;
}
return result.next;
}
if (list1.val <= list2.val) { // 对于list1中的值小于等于list2 ,那就是存list1中的值
current.next = new ListNode(list1.val); // 存在新的链表中
current = current.next;
list1 = list1.next;
} else { // 对于list1中的值大于list2 ,那就是存list2中的值
current.next = new ListNode(list2.val); // 存在新的链表中
current = current.next;
list2 = list2.next;
}
会发现,在if-else中对于链表的后移都是不同的,谁的值存放了就往后移动,这样的话,能够确保就算不是同一个上下位置的话,我也能够保持数据的比较。
最后,我要对list1和list2要进行判断是否有多余的元素,因为这个链表是一个有序的,所以,若是有多余的,就直接连接,反正list1或list2的指针是一直往后移动的。
// 对list1进行判空
if (list1 != null) {
current.next = list1;
}
// 对list2进行判空
if (list2 != null) {
current.next = list2;
}
