问题描述
Given a linked list, swap every two adjacent nodes and return its head.
You may not modify the values in the list’s nodes, only nodes itself may be changed.
Example:
Given 1->2->3->4, you should return the list as 2->1->4->3.
解法思路
初始想法是从左往右遍历链表,对链表操作熟悉的话问题不大
C++代码
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode *res=head;
while(head!=nullptr&&head->next!=nullptr)
{
int a=head->val;
int b=head->next->val;
head->val=b;
head->next->val=a;//两两交换值
head=head->next->next;
}
return res;
}
};
算法结果
Runtime: 8 ms, faster than 41.94% of C++ online submissions for Swap Nodes in Pairs.
Memory Usage: 8.5 MB, less than 100.00% of C++ online submissions for Swap Nodes in Pairs.
算法较慢,需要改进
改进C++代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
int len = 0;
//reverse list.
head = reverse(head, len);
if (len <= 1) return head;
ListNode *tail=0;
if (len % 2 != 0) {
tail = head;
head = head->next;
tail->next = 0;
}
ListNode *a = head->next;
// reverse every two nodes
head = reverse1(head);
if (tail != 0) a->next = tail;
return head;
}
ListNode* reverse(ListNode* head, int& len){
ListNode *h=0, *tmp;
while(head){
++len;
tmp = head->next;
if (h == 0){
h = head;
h->next = 0;
}else{
head->next = h;
h = head;
}
head = tmp;
}
return h;
}
ListNode* reverse1(ListNode *head){
ListNode *h=0, *tmp;
while(head){
tmp = head->next->next;
if (h == 0){
h = head;
h->next->next = 0;
}else{
head->next->next = h;
h = head;
}
head = tmp;
}
return h;
}
};
算法结果
Runtime: 4 ms, faster than 100.00% of C++ online submissions for Swap Nodes in Pairs.
Memory Usage: 8.6 MB, less than 100.00% of C++ online submissions for Swap Nodes in Pairs.