leetcode 143 链表对折

 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

posted @ 2019-03-23 14:14  末夏始秋  阅读(1986)  评论(0编辑  收藏  举报