1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 class Solution { 10 public void reorderList(ListNode head) { 11 ListNode p1 = head; 12 ListNode p2 = head; 13 while (p1 != null && p2 != null && p2.next != null) { 14 p1 = p1.next; 15 p2 = p2.next.next; 16 } 17 if (p1 != null) { 18 p2 = p1.next; 19 p1.next = null; 20 } 21 ListNode pre = reverseList(p2); 22 mergeLists(head, pre); 23 } 24 25 public ListNode reverseList(ListNode p) { 26 if (p == null) 27 return p; 28 ListNode pre = p; 29 p = p.next; 30 pre.next = null; 31 while (p != null) { 32 ListNode tmp = p; 33 p = p.next; 34 tmp.next = pre; 35 pre = tmp; 36 } 37 return pre; 38 } 39 40 public void mergeLists(ListNode head, ListNode pre) { 41 ListNode p1 = head; 42 ListNode p2 = pre; 43 ListNode tmp = null; 44 while (p1 != null && p2 != null) { 45 tmp = p1.next; 46 p1.next = p2; 47 p1 = tmp; 48 tmp = p2.next; 49 if (p1 == null) { 50 break; 51 } 52 p2.next = p1; 53 p2 = tmp; 54 } 55 } 56 }
面试常考的一题,比较繁琐。包含了链表中点,反转链表,合并链表这三大常考的子问题。
代码还不是最优的,后续会更新一个更清晰,简练的版本。
End